正規表達式(Regular Expressions, regex)是一種功能強大的工具,它能夠幫助我們以簡潔的方式處理字串中的複雜邏輯。從資料清洗、文字處理到輸入驗證,正規表達式無處不在。今天,我們將從基礎操作到進階應用,全方位理解如何使用正規表達式提升程式的效能與可讀性。
正規表達式的核心在於其簡潔而靈活的語法,這使得它能夠解決繁瑣的模式匹配問題。我們來回顧幾個常用的語法:
.
:匹配任意字符(除了換行符)^
和 $
:分別匹配字串的開始和結尾[]
:匹配指定範圍內的字符|
:表示邏輯 "或"()
:用於分組,並捕獲匹配的子模式透過這些語法的組合,正規表達式可以描述各種複雜的匹配模式,並能夠快速定位我們需要的資料。
在使用正規表達式的過程中,了解和靈活應用特殊字元是關鍵的一步。以下是一些常見的特殊字元及其應用:
\d
:匹配數字\w
:匹配字母、數字和底線\s
:匹配任何空白字符\b
:匹配單詞邊界\D
、\W
和 \S
:分別與上述匹配相反,即匹配非數字、非字母、非空白字符範例:匹配 IP 地址
import re
ip = "192.168.1.1"
pattern = r'^(\d{1,3}\.){3}\d{1,3}$'
if re.match(pattern, ip):
print("有效的IP地址")
else:
print("無效的IP地址")
在這裡,我們通過正規表達式檢查 IP 地址格式是否正確,並使用了 \d{1,3}
來匹配每個區塊中的 1 到 3 位數字。
除了匹配 IP 地址,我們還可以用正規表達式來驗證電話號碼格式,這在許多應用程式中都有廣泛的使用場景。
範例:檢查美國電話號碼格式
import re
phone_number = "(123) 456-7890"
pattern = r'^\(\d{3}\) \d{3}-\d{4}$'
if re.match(pattern, phone_number):
print("有效的電話號碼")
else:
print("無效的電話號碼")
在這個例子中,我們通過指定括號、空格和短劃線來匹配美國的標準電話號碼格式 (123) 456-7890
。
re.compile()
提升效能在大型專案中,如果需要多次使用相同的正規表達式來處理不同資料,我們可以利用 re.compile()
將正規表達式預先編譯,從而提高匹配效能。
範例:編譯並匹配日期格式
import re
date_pattern = re.compile(r'^\d{4}/\d{2}/\d{2}$')
date = "2024/09/28"
if date_pattern.match(date):
print("有效的日期格式")
else:
print("無效的日期格式")
這裡使用了 re.compile()
來預編譯一個日期匹配模式,這樣在多次使用相同模式時,效能會明顯提升。
re
模組簡化正規表達式匹配對於不需要多次重複使用的簡單匹配任務,Python 的 re
模組提供了方便的方法來快速進行模式匹配,比如 re.match()
、re.search()
和 re.findall()
。
範例:從文本中提取所有的電子郵件地址
import re
text = "聯絡我們:support@example.com 或 info@company.com"
emails = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', text)
print("找到的電子郵件地址:", emails)
這個例子中,我們使用了 re.findall()
來在一段文本中搜尋並提取所有符合電子郵件格式的字串。
正規表達式不僅能處理純文字資料,也能應用於處理二進位資料或位元資料。這在處理低層資料格式、協議分析等領域具有重要作用。
範例:匹配並解析位元資料流中的特定模式
import re
bitstream = "110010101111"
pattern = r'1{2,}'
matches = re.findall(pattern, bitstream)
print("找到的位元模式:", matches)
這段程式碼使用正規表達式在位元資料流中搜尋連續出現的 1
,有效處理了位元資料格式。
自然語言處理(NLP)中的資料往往存在複雜的結構,正規表達式可以幫助提取關鍵訊息,尤其是處理文本的前期階段,例如從一段文本中提取日期、數字或其他具體資訊。
範例:從新聞文本中提取日期與時間資訊
import re
news_text = "會議時間已確定為2024年10月5日,下午3點舉行。"
pattern = r'\d{4}年\d{1,2}月\d{1,2}日'
date_match = re.search(pattern, news_text)
if date_match:
print("找到的日期:", date_match.group())
這個例子展示了如何使用正規表達式從中文新聞文本中提取日期資訊。這樣的應用在資料挖掘和自動化文本處理中非常常見。
正規表達式的強大之處在於它能夠以最簡潔的方式解決最複雜的匹配任務,無論是驗證格式、提取資訊還是處理結構化資料。無論是簡單的字串匹配,還是處理複雜的資料流,正規表達式都能夠為開發者提供高效、靈活的解決方案。
隨著我們對正規表達式的深入學習,這一工具將成為我們處理各種資料格式、實現自動化程式不可或缺的幫手。進一步探索正規表達式的應用,不僅能提高程式的效能,也能讓程式碼變得更加清晰易讀。